package com.project.common;

import com.project.pojo.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Transaction;

import java.util.Map;

@Component
@Slf4j
public class RedisCacheManager {


    @Autowired
    private JedisPool jedisPool;

    /**
     * 根据请求类型 存储 短信验证码 设置失效时间 判断此ip是否多次请求验证码
     *
     * @param key     存储的id
     * @param verCode 验证码
     * @param type    请求类型
     * @param second  失效时间
     * @param ip      请求数据的ip地址
     * @return 1 当前验证码未过期   2  手机号超过当日验证码次数    3  ip超过当日验证码次数上限
     */
    public int cacheForVerificationCode(String key, String verCode, String type, int second, String ip) {

        Jedis jedis = jedisPool.getResource();

        //验证ip   -- start --
        String ipKey = "ip." + ip;
        if (ip == null) {
            return 3;
        }
        //查看 redis缓存中  此ip是否超出上限
        String ipSendCount = jedis.get(ipKey);
        if (ipSendCount != null && Integer.parseInt(ipSendCount) >= 10) {
            return 3;
        }
        //验证ip  -- end --

        //存储redis手机 验证码
        long succ = jedis.setnx(key, verCode);     //先在redis中查看是否有此手机的验证码 //如果里面有这个key (说明key还未过期 ) 就无法设置  返回0  否则没有此key 就可以设置 返回为1
        if (succ == 0) {
            return 1;
        }

        //判断此手机号  请求验证码的 次数
        String sendCount = jedis.get(key + "." + type);
        if (sendCount != null && Integer.parseInt(sendCount) >= 10) {
            jedis.del(key);
            return 2;
        }

        /**无其他异常情况下  进行存储设置验证码**/
        jedis.expire(key, second);       //设置过期时间 毫秒数
        long val = jedis.incr(key + "." + type);  //将此key下的值 自增1(如果 key 不存在，那么 key 的值会先被初始化为 0 ，然后再执行 INCR 操作)
        if (val == 1) {
            jedis.expire(key + "." + type, 86400);
        }
        val = jedis.incr(ipKey);
        if (val == 1) {
            jedis.expire(ipKey, 86400);
        }
        return 0;
    }


    /**
     * 将用户信息存到redis中
     * @param user
     */
    public boolean cacheUserInfo(User user) {
        Jedis jedis;
        Transaction trans = null;
        try {
            jedis = jedisPool.getResource();
            trans = jedis.multi();
            trans.del("username."+user.getToken());
            trans.hmset("username."+user.getToken(),user.toMap());
            trans.expire("username." + user.getToken(),86400);   //一天
            trans.exec();
            return true;
        } catch (Exception e) {
            trans.discard();
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 获取缓存中的用户信息
     * @param username
     * @return
     */
    public User getUserInfo(String username){
        Jedis jedis;
        try {
            jedis = jedisPool.getResource();
            Map<String, String> map = jedis.hgetAll("username."+username);
            return User.fromMap(map);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public boolean delKey(String key) {
        Jedis jedis = jedisPool.getResource();
        Long i = jedis.del(key);
        if(i!=1){
            return false;
        }
        return true;
    }

    /**
     * 根据token获取用户信息
     *
     * @param token
     * @return
     */
    public User getUserByToken(String token) {
        User user = new User();
        if (jedisPool != null) {
            try (Jedis jedis = jedisPool.getResource()) {
                jedis.select(0);
                Map<String, String> map = jedis.hgetAll("username." + token);
                if (!CollectionUtils.isEmpty(map)) {
                    user = User.fromMap(map);
                } else {
                    log.warn("fail to find cached element for token");
                }
            } catch (Exception e) {
                log.error("redis 获取用户信息错误!", e);
                throw e;
            }
        }
        return user;
    }
}
